package model
import(
	"fmt"
	"github.com/garyburd/redigo/redis"
	"encoding/json"
)

//定义一个结构体，完成对User结构体的各种操作
type UserDao struct{
	Pool *redis.Pool
}
var MyUserDao *UserDao
//初始化UserDao单例指针MyUserDao
func InitUserDao(){
	MyUserDao = &UserDao{
		Pool:GlobalPool,
	}
	return
}
//考虑在UserDao中应该提供哪些方法

//1.根据用户ID 返回一个User实例+err
func (this *UserDao) getUserById(conn redis.Conn,id int)(user *User,err error){
	//通过给定id去redis查询这个用户
	res,err := redis.String(conn.Do("HGet","users",id))
	if err !=nil {
		//说明有错误
		if err == redis.ErrNil{//表示在users哈希中没有找到对应的id
			err = MyError.ERROR_USER_NOTEXISTS
		}
		return
	}
	//把res反序列化成User实例
	json.Unmarshal([]byte(res),&user)
	if err!=nil{
		fmt.Println("json.Unmarshal,err=",err)
		return
	}
	return
}

//完成登陆的校验 login
//1.完成对用户的校验
//2.如果用户的id和pwd都正确，则返回一个user实例
//3.如果用户的id或者pwd有错误，则返回对应的错误信息
func (this *UserDao)Login(userId int,userPwd string)(user *User,err error){
	//先从UserDao的连接池中取出一根链接
	conn := this.Pool.Get()
	defer conn.Close()
	user,err = this.getUserById(conn,userId)
	if err!=nil||user==nil{
		return
	}
	//密码错误
	if user.UserPwd !=userPwd {
		err = MyError.ERROR_USER_PWD
		return
	}
	return
}